package com.whvc;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class GradeConverter extends JFrame {
    // 用户输入分数的文本框组件
    private JTextField scoreField;
    // 显示转换后等级结果的标签组件
    private JLabel resultLabel;
    // 显示等级对应评语的标签组件
    private JLabel commentLabel;
    // 触发转换操作的按钮组件
    private JButton convertButton;

    public GradeConverter() {
        // 窗口设置
        setTitle("成绩等级转换器");  // 设置窗口标题
        setSize(400, 300);         // 设置窗口大小为400x300像素
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  // 设置关闭操作：退出程序
        setLayout(new GridLayout(5, 1, 10, 10));  // 使用网格布局，5行1列，水平垂直间距10像素
        setLocationRelativeTo(null); // 将窗口居中显示

        // 组件初始化
        // 创建标题标签并设置字体样式
        JLabel titleLabel = new JLabel("输入你的分数（0-100）", JLabel.CENTER);
        titleLabel.setFont(new Font("微软雅黑", Font.BOLD, 18));

        // 创建分数输入框并设置字体样式
        scoreField = new JTextField();
        scoreField.setFont(new Font("微软雅黑", Font.PLAIN, 16));
        scoreField.setHorizontalAlignment(JTextField.CENTER);  // 文本居中对齐

        // 创建转换按钮并设置样式
        convertButton = new JButton("转换！");
        convertButton.setFont(new Font("微软雅黑", Font.BOLD, 16));
        convertButton.setBackground(new Color(135, 206, 250)); // 设置背景色为浅蓝色

        // 创建结果显示标签
        resultLabel = new JLabel("", JLabel.CENTER);
        resultLabel.setFont(new Font("微软雅黑", Font.BOLD, 20));

        // 创建评语显示标签
        commentLabel = new JLabel("", JLabel.CENTER);
        commentLabel.setFont(new Font("微软雅黑", Font.ITALIC, 14));

        // 添加组件到窗口（按照GridLayout顺序排列）
        add(titleLabel);
        add(scoreField);
        add(convertButton);
        add(resultLabel);
        add(commentLabel);

        // 为转换按钮注册动作事件监听器
        convertButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                convertGrade();  // 点击按钮时执行成绩转换逻辑
            }
        });
    }

    private void convertGrade() {
        try {
            // 解析用户输入的分数字符串为整数
            int score = Integer.parseInt(scoreField.getText());

            // 验证分数范围是否在0-100之间
            if (score < 0 || score > 100) {
                // 分数超出有效范围时弹出错误提示对话框
                JOptionPane.showMessageDialog(this, "请输入0-100之间的分数！", "错误", JOptionPane.ERROR_MESSAGE);
                return;  // 提前结束方法执行
            }

            // 动画效果：按钮点击时变为粉色，300毫秒后恢复原色
            convertButton.setBackground(Color.PINK);
            Timer timer = new Timer(300, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    convertButton.setBackground(new Color(135, 206, 250));  // 恢复原始浅蓝色
                }
            });
            timer.setRepeats(false);  // 设置定时器只执行一次
            timer.start();  // 启动定时器

            // 等级转换逻辑 - 根据分数确定等级和评语
            String grade;      // 存储字母等级
            String comment;    // 存储评价信息

            // 使用if-else梯形结构判断分数区间并分配等级
            if (score >= 90) {
                grade = "A";           // 优秀
                comment = "太棒了！继续保持！";
            } else if (score >= 80) {
                grade = "B";           // 良好
                comment = "很好！再接再厉！";
            } else if (score >= 70) {
                grade = "C";           // 中等
                comment = "不错，但还有提升空间！";
            } else if (score >= 60) {
                grade = "D";           // 及格
                comment = "刚好及格，下次要更努力哦！";
            } else {
                grade = "F";           // 不及格
                comment = "别灰心，加油！你可以做到的！";
            }

            // 显示转换结果到界面上
            resultLabel.setText("等级: " + grade);
            commentLabel.setText(comment);

            // 根据不同等级设置不同的文字颜色以增强视觉效果
            switch (grade) {
                case "A":
                    resultLabel.setForeground(Color.RED);      // A级用红色显示
                    break;
                case "B":
                    resultLabel.setForeground(Color.BLUE);     // B级用蓝色显示
                    break;
                case "C":
                    resultLabel.setForeground(Color.GREEN);    // C级用绿色显示
                    break;
                case "D":
                    resultLabel.setForeground(Color.ORANGE);   // D级用橙色显示
                    break;
                case "F":
                    resultLabel.setForeground(Color.GRAY);     // F级用灰色显示
                    break;
            }
        } catch (NumberFormatException e) {
            // 处理输入非数字字符的情况，弹出错误提示对话框
            JOptionPane.showMessageDialog(this, "请输入有效的数字！", "错误", JOptionPane.ERROR_MESSAGE);
        }
    }

    public static void main(String[] args) {
        // 使用SwingUtilities.invokeLater确保GUI创建在事件调度线程中执行
        SwingUtilities.invokeLater(() -> {
            GradeConverter converter = new GradeConverter();  // 创建成绩转换器实例
            converter.setVisible(true);                       // 显示窗口
        });
    }
}